package com.fei.wechat.common.service;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.data.redis.core.RedisTemplate;

/**
 * * 缓存代理接口
 * <p>
 * 提供缓存内容操作接口，包括key以及value的操作，本代理只提供缓存基本操作，不提供涉及连接等连接池操作。
 * <P>
 * 1、以H开头的为HASH操作命令；
 * <P>
 * 2、以L开头的为LIST操作命令；
 * <P>
 * ; 3、以S开头的为SET（集合）操作命令；
 * <P>
 * 4、以Z开头的为ZSET（有序集合）操作命令
 * 
 */
public interface IJedisProxy
{
    
    /**  
    * @Description: 获取封装的redisTemplate源
    * @param @return    设定文件  
    * @return RedisTemplate<String,Object>    返回类型  
    */
    public RedisTemplate<String, Object> getRedisTemplateSource();
    
    /**
     * 将字符串值value关联到key。 如果key已经持有其他值，SET就覆写旧值，无视类型。
     * 
     * @param key
     *            key
     * @param value
     *            value
     * @return string
     */
    public boolean set(String key, Object value);
    
    /**
     * 将Object值value关联到key。 如果key已经持有其他值，SET就覆写旧值，无视类型。
     * 
     * @param key
     *            key
     * @param value
     *            value
     * @return string
     */
    public boolean setObj(String key, Object value);
    
    /**
     * 返回key所关联的Object对象
     * <p>
     * 假如key储存的值不是字符串类型，返回一个错误，因为GET只能用于处理字符串值
     * 
     * @param key
     *            key
     * @return String
     */
    public Object getObj(String key);
    
    /**
     * 返回key所关联的字符串值
     * <p>
     * 假如key储存的值不是字符串类型，返回一个错误，因为GET只能用于处理字符串值
     * 
     * @param key
     *            key
     * @return String
     */
    public Object get(String key);
    
    /**
     * 检查给定key是否存在。
     * <p>
     * 
     * @param key
     *            key
     * @return 是否
     */
    public Boolean exists(String key);
    
    /**
     * 返回key所储存的值的类型
     * 
     * @param key
     *            key
     * @return String
     */
    public String type(String key);
    
    /**
     * 返回给定key的剩余生存时间(time to live)(以秒为单位)。
     * 
     * @param key
     *            key
     * @return Long
     */
    public Long ttl(String key);
    
    /**
     * 将key所储存的值加上增量increment。 如果key不存在，以0为key的初始值，然后执行INCRBY命令。 如果值包含错误的类型，或字符串类型的值不能表示为数字，那么返回一个错误
     * 
     * @param key
     *            key
     * @param integer
     *            integer
     * @return 值
     */
    public Long incrBy(String key, long integer);
    
    /**
     * 将key中储存的数字值增一。 如果key不存在，以0为key的初始值，然后执行INCR操作。 如果值包含错误的类型，或字符串类型的值不能表示为数字，那么返回一个错误。
     * 
     * @param key
     *            key
     * @return Long
     */
    public Long incr(String key);
    
    /**
     * 将哈希表key中的域field的值设为value。 如果key不存在，一个新的哈希表被创建并进行HSET操作。 如果域field已经存在于哈希表中，旧值将被覆盖。
     * 
     * @param key
     *            key
     * @param field
     *            field
     * @param value
     *            value
     * @return 值
     */
    public boolean hset(String key, String field, Object value);
    
    /**
     * 返回哈希表key中给定域field的值。
     * 
     * @param key
     *            key
     * @param field
     *            field
     * @return 值
     */
    public Object hget(String key, String field);
    
    /**
     * Hash Values 获取hash中的全部值
     * 
     * @param key 键 不能为null
     * @return 值
     */
    public List<Object> hvalues(String key);
    
    /**
     * 同时将多个field - value(域-值)对设置到哈希表key中。 此命令会覆盖哈希表中已存在的域。
     * 
     * @param key
     *            key
     * @param hash
     *            hash
     * @return 值
     */
    public boolean hmset(String key, Map<Object, Object> hash);
    
    /**
     * 返回哈希表key中，一个或多个给定域的值。
     * 
     * @param key
     *            key
     * @param fields
     *            fields
     * @return 值
     */
    public List<String> hmget(String key, String... fields);
    
    /**
     * hincrBy
     * 
     * @param key
     *            key
     * @param field
     *            field
     * @param value
     *            value
     * @return Long
     */
    public Long hincrBy(String key, String field, long value);
    
    /**
     * 为哈希表key中的域field的值加上增量increment。 增量也可以为负数，相当于对给定域进行减法操作。 如果key不存在，一个新的哈希表被创建并执行HINCRBY命令。
     * 如果域field不存在，那么在执行命令前，域的值被初始化为0。
     * 
     * @param key
     *            key
     * @param field
     *            field
     * @return 是否
     */
    public Boolean hexists(String key, String field);
    
    /**
     * 移除给定的一个或多个key。 如果key不存在，则忽略该命令。
     * 
     * @param key
     *            key
     * @return Long
     */
    public void del(String key);
    
    /**
     * 删除哈希表key中的一个指定域，不存在的域将被忽略
     * 
     * @param key
     *            key
     * @param field
     *            field
     * @return Long
     */
    public Long hdel(String key, String field);
    
    /**
     * 将一个值value插入到列表key的表尾。
     * 
     * @param key
     *            key
     * @param string
     *            string
     * @return Long
     */
    public Long rpush(String key, String string);
    
    /**
     * 将一个值value插入到列表key的表头。
     * 
     * @param key
     *            key
     * @param string
     *            string
     * @return Long
     */
    public Long lpush(String key, String string);
    
    /**
     * 为给定key设置生存时间。单位秒 当key过期时，它会被自动删除。
     * 
     * @param key
     *            key
     * @param seconds
     *            seconds
     * @return Long
     */
    public boolean expire(String key, long seconds);
    
    /**
     * 根据key 获取过期时间
     * 
     * @param key
     *            键 不能为null
     * @return 时间(秒) 返回0代表为永久有效
     */
    public long getExpire(String key);
    
    /**
     * 判断key是否存在
     * 
     * @param key
     *            键
     * @return true 存在 false不存在
     */
    public boolean hasKey(String key);
    
    /**
     * 删除缓存
     * 
     * @param key
     *            可以传一个值 或多个
     */
    public void del(String... key);
    
    /**
     * 普通缓存放入并设置时间
     * 
     * @param key
     *            键
     * @param value
     *            值
     * @param time
     *            时间(秒) time要大于0 如果time小于等于0 将设置无限期
     * @return true成功 false 失败
     */
    public boolean set(String key, Object value, long time);
    
    /**
     * 递增
     * 
     * @param key
     *            键
     * @param by
     *            要增加几(大于0)
     * @return
     */
    public long incr(String key, long delta);
    
    /**
     * 获取hashKey对应的所有键值
     * 
     * @param key
     *            键
     * @return 对应的多个键值
     */
    public Map<Object, Object> hmget(String key);
    
    /**
     * HashSet 并设置时间
     * 
     * @param key
     *            键
     * @param map
     *            对应多个键值
     * @param time
     *            时间(秒)
     * @return true成功 false失败
     */
    public boolean hmset(String key, Map<Object, Object> map, long time);
    
    /**
     * 向一张hash表中放入数据,如果不存在将创建
     * 
     * @param key
     *            键
     * @param item
     *            项
     * @param value
     *            值
     * @param time
     *            时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
     * @return true 成功 false失败
     */
    public boolean hset(String key, String item, Object value, long time);
    
    /**
     * 删除hash表中的值
     * 
     * @param key
     *            键 不能为null
     * @param item
     *            项 可以使多个 不能为null
     */
    public Long hdel(String key, Object... item);
    
    /**
     * 判断hash表中是否有该项的值
     * 
     * @param key
     *            键 不能为null
     * @param item
     *            项 不能为null
     * @return true 存在 false不存在
     */
    public boolean hHasKey(String key, String item);
    
    /**
     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
     * 
     * @param key
     *            键
     * @param item
     *            项
     * @param by
     *            要增加几(大于0)
     * @return
     */
    public double hincr(String key, String item, double by);
    
    /**
     * hash递减
     * 
     * @param key
     *            键
     * @param item
     *            项
     * @param by
     *            要减少记(小于0)
     * @return
     */
    public double hdecr(String key, String item, double by);
    
    /**
     * 根据key获取Set中的所有值
     * 
     * @param key
     *            键
     * @return
     */
    public Set<Object> sGet(String key);
    
    /**
     * 根据value从一个set中查询,是否存在
     * 
     * @param key
     *            键
     * @param value
     *            值
     * @return true 存在 false不存在
     */
    public boolean sHasKey(String key, Object value);
    
    /**
     * 将数据放入set缓存
     * 
     * @param key
     *            键
     * @param values
     *            值 可以是多个
     * @return 成功个数
     */
    public long sSet(String key, Object... values);
    
    /**
     * 将set数据放入缓存
     * 
     * @param key
     *            键
     * @param time
     *            时间(秒)
     * @param values
     *            值 可以是多个
     * @return 成功个数
     */
    public long sSetAndTime(String key, long time, Object... values);
    
    /**
     * 获取set缓存的长度
     * 
     * @param key
     *            键
     * @return
     */
    public long sGetSetSize(String key);
    
    /**
     * 移除值为value的
     * 
     * @param key
     *            键
     * @param values
     *            值 可以是多个
     * @return 移除的个数
     */
    public long setRemove(String key, Object... values);
    
    /**
     * 获取list缓存的内容
     * 
     * @param key
     *            键
     * @param start
     *            开始
     * @param end
     *            结束 0 到 -1代表所有值
     * @return
     */
    public List<Object> lGet(String key, long start, long end);
    
    /**
     * 获取list缓存的长度
     * 
     * @param key
     *            键
     * @return
     */
    public long lGetListSize(String key);
    
    /**
     * 通过索引 获取list中的值
     * 
     * @param key
     *            键
     * @param index
     *            索引 index>=0时， 0 表头，1 第二个元素，依次类推；index<0时，-1，表尾，-2倒数第二个元素，依次类推
     * @return
     */
    public Object lGetIndex(String key, long index);
    
    /**
     * 将list放入缓存
     * 
     * @param key
     *            键
     * @param value
     *            值
     * @param time
     *            时间(秒)
     * @return
     */
    public boolean lSet(String key, Object value);
    
    /**
     * 将list放入缓存
     * 
     * @param key
     *            键
     * @param value
     *            值
     * @param time
     *            时间(秒)
     * @return
     */
    public boolean lSet(String key, Object value, long time);
    
    /**
     * 将list放入缓存
     * 
     * @param key
     *            键
     * @param value
     *            值
     * @param time
     *            时间(秒)
     * @return
     */
    public boolean lSet(String key, List<Object> value);
    
    /**
     * 将list放入缓存
     * 
     * @param key
     *            键
     * @param value
     *            值
     * @param time
     *            时间(秒)
     * @return
     */
    public boolean lSet(String key, List<Object> value, long time);
    
    /**
     * 根据索引修改list中的某条数据
     * 
     * @param key
     *            键
     * @param index
     *            索引
     * @param value
     *            值
     * @return
     */
    public boolean lUpdateIndex(String key, long index, Object value);
    
    /**
     * 移除N个值为value
     * 
     * @param key
     *            键
     * @param count
     *            移除多少个
     * @param value
     *            值
     * @return 移除的个数
     */
    public long lRemove(String key, long count, Object value);
    
    /**
     * 描述：将value存放在set集合当中
     * 作者：张进飞
     * 时间：2018年4月21日 下午3:53:43
     * @param redisKey
     * @param value
     * @return
     */
    public boolean pushDataBySadd(String redisKey, String value);
    
    /**
     * 描述：将value从set集合当中删除
     * 作者：张进飞
     * 时间：2018年4月21日 下午3:54:07
     * @param redisKey
     * @param value
     * @return
     */
    public boolean delDataBySrem(String redisKey, String value);
    
    /**
     * 描述：判断value是否是set集合当中的元素
     * 作者：张进飞
     * 时间：2018年4月21日 下午3:54:44
     * @param redisKey
     * @param value
     * @return
     */
    public boolean existDataBySismember(String redisKey, String value);
}
